﻿///////////////////////////////////////////////////////////////////////////////////////////////////////
// Copyright (c) 2023, ООО 1С-Софт
// Все права защищены. Эта программа и сопроводительные материалы предоставляются 
// в соответствии с условиями лицензии Attribution 4.0 International (CC BY 4.0)
// Текст лицензии доступен по ссылке:
// https://creativecommons.org/licenses/by/4.0/legalcode
///////////////////////////////////////////////////////////////////////////////////////////////////////

#Область ПрограммныйИнтерфейс

#Область ОповещениеПользователя

// АПК:142-выкл 4 необязательных параметра для совместимости 
// с устаревшей процедурой ОбщегоНазначенияКлиентСервер.СообщитьПользователю.

// Формирует и выводит сообщение, которое может быть связано с элементом управления формы.
//
// См. ОбщегоНазначения.СообщитьПользователю
//
// Параметры:
//  ТекстСообщенияПользователю - Строка - текст сообщения.
//  КлючДанных - ЛюбаяСсылка - объект или ключ записи информационной базы, к которому это сообщение относится.
//  Поле - Строка - наименование реквизита формы.
//  ПутьКДанным - Строка - путь к данным (путь к реквизиту формы).
//  Отказ - Булево - выходной параметр, всегда устанавливается в значение Истина.
//
// Пример:
//
//  1. Для вывода сообщения у поля управляемой формы, связанного с реквизитом объекта:
//  ОбщегоНазначенияКлиент.СообщитьПользователю(
//   НСтр("ru = 'Сообщение об ошибке.'"), ,
//   "ПолеВРеквизитеФормыОбъект",
//   "Объект");
//
//  Альтернативный вариант использования в форме объекта:
//  ОбщегоНазначенияКлиент.СообщитьПользователю(
//   НСтр("ru = 'Сообщение об ошибке.'"), ,
//   "Объект.ПолеВРеквизитеФормыОбъект");
//
//  2. Для вывода сообщения рядом с полем управляемой формы, связанным с реквизитом формы:
//  ОбщегоНазначенияКлиент.СообщитьПользователю(
//   НСтр("ru = 'Сообщение об ошибке.'"), ,
//   "ИмяРеквизитаФормы");
//
//  3. Для вывода сообщения связанного с объектом информационной базы:
//  ОбщегоНазначенияКлиент.СообщитьПользователю(
//   НСтр("ru = 'Сообщение об ошибке.'"), ОбъектИнформационнойБазы, "Ответственный",,Отказ);
//
//  4. Для вывода сообщения по ссылке на объект информационной базы:
//  ОбщегоНазначенияКлиент.СообщитьПользователю(
//   НСтр("ru = 'Сообщение об ошибке.'"), Ссылка, , , Отказ);
//
//  Случаи некорректного использования:
//   1. Передача одновременно параметров КлючДанных и ПутьКДанным.
//   2. Передача в параметре КлючДанных значения типа отличного от допустимого.
//   3. Установка ссылки без установки поля (и/или пути к данным).
//
Процедура СообщитьПользователю(Знач ТекстСообщенияПользователю,	Знач КлючДанных = Неопределено,
	Знач Поле = "", Знач ПутьКДанным = "", Отказ = Ложь) Экспорт
	
	Сообщение = ОбщегоНазначенияСлужебныйКлиентСервер.СообщениеПользователю(ТекстСообщенияПользователю,
		КлючДанных, Поле, ПутьКДанным, Отказ);
	
	Сообщение.Сообщить()
	
КонецПроцедуры

// АПК:142-вкл

#КонецОбласти

#Область ДанныеВБазе

////////////////////////////////////////////////////////////////////////////////
// Общие процедуры и функции для работы с данными в базе.

// Возвращает ссылку предопределенного элемента по его полному имени.
// Предопределенные элементы могут содержаться только в следующих объектах:
//   - справочники;
//   - планы видов характеристик;
//   - планы счетов;
//   - планы видов расчета.
// После изменения состава предопределенных следует выполнить метод
// ОбновитьПовторноИспользуемыеЗначения(), который сбросит кэш ПовтИсп в текущем сеансе.
//
// См. ОбщегоНазначения.ПредопределенныйЭлемент
//
// Параметры:
//   ПолноеИмяПредопределенного - Строка - полный путь к предопределенному элементу, включая его имя.
//     Формат аналогичен функции глобального контекста ПредопределенноеЗначение().
//     Например:
//       "Справочник.ВидыКонтактнойИнформации.EmailПользователя"
//       "ПланСчетов.Хозрасчетный.Материалы"
//       "ПланВидовРасчета.Начисления.ОплатаПоОкладу".
//
// Возвращаемое значение: 	
//   ЛюбаяСсылка - ссылка на предопределенный элемент.
//   Неопределено - если предопределенный элемент есть в метаданных, но не создан в ИБ.
//
Функция ПредопределенныйЭлемент(ПолноеИмяПредопределенного) Экспорт
	
	Если ОбщегоНазначенияСлужебныйКлиентСервер.ИспользоватьСтандартнуюФункциюПолученияПредопределенного(
		ПолноеИмяПредопределенного) Тогда 
		
		Возврат ПредопределенноеЗначение(ПолноеИмяПредопределенного);
	КонецЕсли;
	
	ПоляПредопределенного = ОбщегоНазначенияСлужебныйКлиентСервер.ИмяПредопределенногоПоПолям(ПолноеИмяПредопределенного);
	
	ПредопределенныеЗначения = СтандартныеПодсистемыКлиентПовтИсп.СсылкиПоИменамПредопределенных(
		ПоляПредопределенного.ПолноеИмяОбъектаМетаданных);
	
	Возврат ОбщегоНазначенияСлужебныйКлиентСервер.ПредопределенныйЭлемент(
		ПолноеИмяПредопределенного, ПоляПредопределенного, ПредопределенныеЗначения);
	
КонецФункции

// Возвращает код основного языка информационной базы, например "ru".
// На котором программно записываются автогенерируемые строки в информационную базу.
// Например, при начальном заполнении информационной базы данными из макета, автогенерации комментария
// к проводке или определении значения параметра ИмяСобытия метода ЗаписьЖурналаРегистрации.
//
// Возвращаемое значение:
//  Строка - код языка.
//
Функция КодОсновногоЯзыка() Экспорт
	
	Возврат СтандартныеПодсистемыКлиент.ПараметрКлиента("КодОсновногоЯзыка");
	
КонецФункции

#КонецОбласти

#Область УсловныеВызовы

////////////////////////////////////////////////////////////////////////////////
// Процедуры и функции для вызова необязательных подсистем.

// Возвращает Истина, если функциональная подсистема существует в конфигурации.
// Предназначена для реализации вызова необязательной подсистемы (условного вызова).
// У функциональной подсистемы снят флажок "Включать в командный интерфейс".
// См. также ОбщегоНазначенияПереопределяемый.ПриОпределенииОтключенныхПодсистем,
// и ОбщегоНазначения.ПодсистемаСуществует для вызова из серверного кода.
//
// Параметры:
//  ПолноеИмяПодсистемы - Строка - полное имя объекта метаданных подсистема
//                        без слов "Подсистема." и с учетом регистра символов.
//                        Например: "СтандартныеПодсистемы.ВариантыОтчетов".
//
// Пример:
//  Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ВариантыОтчетов") Тогда
//  	МодульВариантыОтчетов = ОбщегоНазначения.ОбщийМодуль("ВариантыОтчетов");
//  	МодульВариантыОтчетов.<Имя метода>();
//  КонецЕсли;
//
// Возвращаемое значение:
//  Булево - Истина, если существует.
//
Функция ПодсистемаСуществует(ПолноеИмяПодсистемы) Экспорт
	
	ИмяПараметра = "СтандартныеПодсистемы.ПодсистемыКонфигурации";
	Если ПараметрыПриложения[ИмяПараметра] = Неопределено Тогда
		ИменаПодсистем = СтандартныеПодсистемыКлиент.ПараметрыРаботыКлиентаПриЗапуске().ИменаПодсистем;
		ПараметрыПриложения.Вставить(ИмяПараметра, ИменаПодсистем);
	КонецЕсли;
	ИменаПодсистем = ПараметрыПриложения[ИмяПараметра];
	Возврат ИменаПодсистем.Получить(ПолноеИмяПодсистемы) <> Неопределено;
	
КонецФункции

// Возвращает ссылку на общий модуль или модуль менеджера по имени.
//
// См. ОбщегоНазначения.ОбщийМодуль
//
// Параметры:
//  Имя - Строка - имя общего модуля.
//
// Возвращаемое значение:
//  ОбщийМодуль
//  СправочникМенеджер,
//  ДокументМенеджер,
//  ОбработкаМенеджер,
//  РегистрСведенийМенеджер.
//
// Пример:
//	Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ОбновлениеКонфигурации") Тогда
//		МодульОбновлениеКонфигурации = ОбщегоНазначения.ОбщийМодуль("ОбновлениеКонфигурации");
//		МодульОбновлениеКонфигурации.<Имя метода>();
//	КонецЕсли;
//
//	Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ПолнотекстовыйПоиск") Тогда
//		МодульПолнотекстовыйПоискСервер = ОбщегоНазначения.ОбщийМодуль("ПолнотекстовыйПоискСервер");
//		МодульПолнотекстовыйПоискСервер.<Имя метода>();
//	КонецЕсли;
//
Функция ОбщийМодуль(Имя) Экспорт
	
	Модуль = Вычислить(Имя);
	
#Если Не ВебКлиент Тогда
	
	// В веб-клиенте не проверяется
	// т.к. при обращении к модулям с вызовом сервера типа такого модуля в веб-клиенте не существует.
	
	Если ТипЗнч(Модуль) <> Тип("ОбщийМодуль") Тогда
		ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
			НСтр("ru = 'Общий модуль ""%1"" не существует.'"), 
			Имя);
	КонецЕсли;
	
#КонецЕсли
	
	Возврат Модуль;
	
КонецФункции

#КонецОбласти

#Область ТекущееОкружение

////////////////////////////////////////////////////////////////////////////////
// Функции описания текущего окружения клиентского приложения и операционной системы.

// Возвращает Истина, если клиентское приложение запущено под управлением ОС Windows.
//
// См. ОбщегоНазначения.ЭтоWindowsКлиент
//
// Возвращаемое значение:
//  Булево - если нет клиентского приложения, возвращается Ложь.
//
Функция ЭтоWindowsКлиент() Экспорт
	
	ТипПлатформыКлиента = ТипПлатформыКлиента();
	Возврат ТипПлатформыКлиента = ТипПлатформы.Windows_x86
		Или ТипПлатформыКлиента = ТипПлатформы.Windows_x86_64;
	
КонецФункции

// Возвращает Истина, если клиентское приложение запущено под управлением ОС Linux.
//
// См. ОбщегоНазначения.ЭтоLinuxКлиент
//
// Возвращаемое значение:
//  Булево - если нет клиентского приложения, возвращается Ложь.
//
Функция ЭтоLinuxКлиент() Экспорт
	
	СистемнаяИнформация = Новый СистемнаяИнформация;
	ТипПлатформыКлиента = СистемнаяИнформация.ТипПлатформы;
	
	Возврат ТипПлатформыКлиента = ТипПлатформы.Linux_x86
		Или ТипПлатформыКлиента = ТипПлатформы.Linux_x86_64
		Или ОбщегоНазначенияКлиентСервер.СравнитьВерсии(СистемнаяИнформация.ВерсияПриложения, "8.3.22.0") >= 0
			И (ТипПлатформыКлиента = ТипПлатформы["Linux_ARM64"]
			Или ТипПлатформыКлиента = ТипПлатформы["Linux_E2K"]);
	
КонецФункции

// Возвращает Истина, если клиентское приложение запущено под управлением macOS.
//
// См. ОбщегоНазначения.ЭтоMacOSКлиент
//
// Возвращаемое значение:
//  Булево - если нет клиентского приложения, возвращается Ложь.
//
Функция ЭтоMacOSКлиент() Экспорт
	
	ТипПлатформыКлиента = ТипПлатформыКлиента();
	Возврат ТипПлатформыКлиента = ТипПлатформы.MacOS_x86
		Или ТипПлатформыКлиента = ТипПлатформы.MacOS_x86_64;
	
КонецФункции

// Возвращает Истина, если клиентское приложение подключено к базе через веб-сервер.
//
// См. ОбщегоНазначения.КлиентПодключенЧерезВебСервер
//
// Возвращаемое значение:
//  Булево - Истина, если подключен.
//
Функция КлиентПодключенЧерезВебСервер() Экспорт
	
	Возврат СтрНайти(ВРег(СтрокаСоединенияИнформационнойБазы()), "WS=") = 1;
	
КонецФункции

// Возвращает Истина, если включен режим отладки.
//
// См. ОбщегоНазначения.РежимОтладки
//
// Возвращаемое значение:
//  Булево - Истина, если включен режим отладки.
//
Функция РежимОтладки() Экспорт
	
	Возврат СтрНайти(ПараметрЗапуска, "РежимОтладки") > 0;
	
КонецФункции

// Возвращает объем оперативной памяти, доступной клиентскому  приложению.
//
// См. ОбщегоНазначения.ОперативнаяПамятьДоступнаяКлиентскомуПриложению
//
// Возвращаемое значение:
//  Число - количество гигабайтов оперативной памяти с точностью до десятых долей.
//  Неопределено - нет клиентского приложения, то есть ТекущийРежимЗапуска() = Неопределено.
//
Функция ОперативнаяПамятьДоступнаяКлиентскомуПриложению() Экспорт
	
	СистемнаяИнформация = Новый СистемнаяИнформация;
	Возврат Окр(СистемнаяИнформация.ОперативнаяПамять / 1024, 1);
	
КонецФункции

// Определяет режим эксплуатации информационной базы файловый (Истина) или серверный (Ложь).
// При проверке используется СтрокаСоединенияИнформационнойБазы, которую можно указать явно.
//
// См. ОбщегоНазначения.ИнформационнаяБазаФайловая
//
// Параметры:
//  СтрокаСоединенияИнформационнойБазы - Строка - параметр используется, если
//                 нужно проверить строку соединения не текущей информационной базы.
//
// Возвращаемое значение:
//  Булево - Истина, если файловая.
//
Функция ИнформационнаяБазаФайловая(Знач СтрокаСоединенияИнформационнойБазы = "") Экспорт
	
	Если Не ПустаяСтрока(СтрокаСоединенияИнформационнойБазы) Тогда
		Возврат СтрНайти(ВРег(СтрокаСоединенияИнформационнойБазы), "FILE=") = 1;
	КонецЕсли;
	
	Возврат СтандартныеПодсистемыКлиент.ПараметрКлиента("ИнформационнаяБазаФайловая");
	
КонецФункции

// Возвращает тип платформы клиента.
//
// Возвращаемое значение:
//  ТипПлатформы, Неопределено - тип платформы на которой запущен клиент. В режиме веб-клиента, если тип 
//                               платформы иной, чем описан в типе ТипПлатформы, то возвращается Неопределено.
//
Функция ТипПлатформыКлиента() Экспорт
	
	СистемнаяИнфо = Новый СистемнаяИнформация;
	Возврат СистемнаяИнфо.ТипПлатформы;
	
КонецФункции

// Возвращает признак работы в режиме разделения данных по областям
// (технически это признак условного разделения).
// 
// Возвращает Ложь, если конфигурация не может работать в режиме разделения данных
// (не содержит общих реквизитов, предназначенных для разделения данных).
//
// Возвращаемое значение:
//  Булево - Истина, если разделение включено,
//           Ложь, если разделение выключено или не поддерживается.
//
Функция РазделениеВключено() Экспорт
	
	Возврат СтандартныеПодсистемыКлиент.ПараметрКлиента("РазделениеВключено");
	
КонецФункции

// Возвращает признак возможности обращения к разделенным данным (которые входят в состав разделителей).
// Признак относится к сеансу, но может меняться во время работы сеанса, если разделение было включено
// в самом сеансе, поэтому проверку следует делать непосредственно перед обращением к разделенным данным.
// 
// Возвращает Истина, если конфигурация не может работать в режиме разделения данных
// (не содержит общих реквизитов, предназначенных для разделения данных).
//
// Возвращаемое значение:
//   Булево - Истина, если разделение не поддерживается, либо разделение выключено,
//                    либо разделение включено и разделители установлены.
//            Ложь, если разделение включено и разделители не установлены.
//
Функция ДоступноИспользованиеРазделенныхДанных() Экспорт
	
	Возврат СтандартныеПодсистемыКлиент.ПараметрКлиента("ДоступноИспользованиеРазделенныхДанных");
	
КонецФункции

#КонецОбласти

#Область Даты

////////////////////////////////////////////////////////////////////////////////
// Функции для работы с датами с учетом часового пояса сеанса

// Возвращает текущую дату, приведенную к часовому поясу сеанса.
// Предназначена для использования вместо функции ТекущаяДата() в клиентском коде
// в тех случаях, когда нет возможности перевести выполнение алгоритма в серверный код.
//
// Функция возвращает время, близкое к результату функции ТекущаяДатаСеанса в серверном коде.
// Погрешность обусловлена временем выполнения серверного вызова.
// Кроме того, если на клиентском компьютере перевести время, то функция учтет это изменение 
// не сразу, а только после следующего сброса кеша повторно используемых значений
// (см. также метод ОбновитьПовторноИспользуемыеЗначения).
// Поэтому алгоритмы, для которых точное время критически важно, следует размещать в серверном коде,
// а не в клиентском.
//
// Возвращаемое значение:
//  Дата - текущая дата сеанса.
//
Функция ДатаСеанса() Экспорт
	
	Поправка = СтандартныеПодсистемыКлиент.ПараметрКлиента("ПоправкаКВремениСеанса");
	Возврат ТекущаяДата() + Поправка; // АПК:143 ТекущаяДата() для вычисления времени сеанса
	
КонецФункции

// Возвращает универсальную дату сеанса, получаемую из текущей даты сеанса.
//
// Функция возвращает время, близкое к результату функции УниверсальноеВремя() в серверном контексте.
// Погрешность обусловлена временем выполнения серверного вызова.
// Предназначена для использования вместо функции УниверсальноеВремя().
//
// Возвращаемое значение:
//  Дата - универсальная дата сеанса.
//
Функция ДатаУниверсальная() Экспорт
	
	ПараметрыКлиента = СтандартныеПодсистемыКлиент.ПараметрКлиента();
	
	ДатаСеанса = ТекущаяДата() + ПараметрыКлиента.ПоправкаКВремениСеанса;
	Возврат ДатаСеанса + ПараметрыКлиента.ПоправкаКУниверсальномуВремени;
	
КонецФункции

// Преобразует локальную дату к формату "YYYY-MM-DDThh:mm:ssTZD" согласно ISO 8601.
//
// См. ОбщегоНазначения.ПредставлениеЛокальнойДатыСоСмещением
//
// Параметры:
//  ЛокальнаяДата - Дата - дата в часовом поясе сеанса.
// 
// Возвращаемое значение:
//   Строка - представление даты.
//
Функция ПредставлениеЛокальнойДатыСоСмещением(ЛокальнаяДата) Экспорт
	
	Смещение = СтандартныеПодсистемыКлиент.ПараметрКлиента("СмещениеСтандартногоВремени");
	Возврат ОбщегоНазначенияСлужебныйКлиентСервер.ПредставлениеЛокальнойДатыСоСмещением(ЛокальнаяДата, Смещение);
	
КонецФункции

#КонецОбласти

#Область Данные

////////////////////////////////////////////////////////////////////////////////
// Общие процедуры и функции для работы с прикладными типами и коллекциями значений.

// Создает полную копию структуры, соответствия, массива, списка или таблицы значений, рекурсивно,
// с учетом типов дочерних элементов. При этом содержимое значений объектных типов
// (СправочникОбъект, ДокументОбъект и т.п.) не копируются, а возвращаются ссылки на исходный объект.
//
// См. ОбщегоНазначения.СкопироватьРекурсивно
//
// Параметры:
//  Источник - Структура
//           - ФиксированнаяСтруктура
//           - Соответствие
//           - ФиксированноеСоответствие
//           - Массив
//           - ФиксированныйМассив
//           - СписокЗначений - объект, который необходимо скопировать.
//  ФиксироватьДанные - Булево
//                    - Неопределено - если Истина - фиксировать,
//                          если Ложь - снять фиксацию, если Неопределено - не изменять.
//
// Возвращаемое значение:
//  Структура
//  ФиксированнаяСтруктура
//  Соответствие
//  ФиксированноеСоответствие
//  Массив
//  ФиксированныйМассив
//  СписокЗначений - копия объекта, переданного в параметре Источник.
//
Функция СкопироватьРекурсивно(Источник, ФиксироватьДанные = Неопределено) Экспорт
	
	Перем Приемник;
	
	ТипИсточника = ТипЗнч(Источник);
	
	Если ТипИсточника = Тип("Структура")
		Или ТипИсточника = Тип("ФиксированнаяСтруктура") Тогда
		Приемник = ОбщегоНазначенияСлужебныйКлиент.СкопироватьСтруктуру(Источник, ФиксироватьДанные);
	ИначеЕсли ТипИсточника = Тип("Соответствие")
		Или ТипИсточника = Тип("ФиксированноеСоответствие") Тогда
		Приемник = ОбщегоНазначенияСлужебныйКлиент.СкопироватьСоответствие(Источник, ФиксироватьДанные);
	ИначеЕсли ТипИсточника = Тип("Массив")
		Или ТипИсточника = Тип("ФиксированныйМассив") Тогда
		Приемник = ОбщегоНазначенияСлужебныйКлиент.СкопироватьМассив(Источник, ФиксироватьДанные);
	ИначеЕсли ТипИсточника = Тип("СписокЗначений") Тогда
		Приемник = ОбщегоНазначенияСлужебныйКлиент.СкопироватьСписокЗначений(Источник, ФиксироватьДанные);
	Иначе
		Приемник = Источник;
	КонецЕсли;
	
	Возврат Приемник;
	
КонецФункции

// Проверяет, что в параметре команды Параметр передан объект ожидаемого типа ОжидаемыйТип.
// В противном случае, выдает стандартное сообщение и возвращает Ложь.
// Такая ситуация возможна, например, если в списке выделена строка группировки.
//
// Для использования в командах, работающих с элементами динамических списков в формах.
// 
// Параметры:
//  Параметр     - Массив
//               - ЛюбаяСсылка - параметр команды.
//  ОжидаемыйТип - Тип                 - ожидаемый тип параметра.
//
// Возвращаемое значение:
//  Булево - Истина, если параметр ожидаемого типа.
//
// Пример:
// 
//   Если НЕ ОбщегоНазначенияКлиент.ПроверитьТипПараметраКоманды(
//      Элементы.Список.ВыделенныеСтроки, Тип("ЗадачаСсылка.ЗадачаИсполнителя")) Тогда
//      Возврат;
//   КонецЕсли;
//   ...
//
Функция ПроверитьТипПараметраКоманды(Знач Параметр, Знач ОжидаемыйТип) Экспорт
	
	Если Параметр = Неопределено Тогда
		Возврат Ложь;
	КонецЕсли;
	
	Результат = Истина;
	
	Если ТипЗнч(Параметр) = Тип("Массив") Тогда
		// Если в массиве один элемент и он неправильного типа...
		Результат = НЕ (Параметр.Количество() = 1 И ТипЗнч(Параметр[0]) <> ОжидаемыйТип);
	Иначе
		Результат = ТипЗнч(Параметр) = ОжидаемыйТип;
	КонецЕсли;
	
	Если НЕ Результат Тогда
		ПоказатьПредупреждение(,НСтр("ru = 'Действие не может быть выполнено для выбранного элемента.'"));
	КонецЕсли;
	
	Возврат Результат;
	
КонецФункции

#КонецОбласти

#Область Формы

////////////////////////////////////////////////////////////////////////////////
// Клиентские процедуры общего назначения для работы в формами.

// Задает вопрос о продолжении действия, которое приведет к потере изменений:
// "Данные были изменены. Сохранить изменения?" 
// Для использования в обработчиках события ПередЗакрытием модулей форм объектов,
// которые возможно записать в информационную базу.
// Отображение вопроса зависит свойства модифицированности формы.
// 
// См. также процедуру ОбщегоНазначенияКлиент.ПоказатьПодтверждениеЗакрытияПроизвольнойФормы.
//
// Параметры:
//  ОповещениеСохранитьИЗакрыть  - ОписаниеОповещения - содержит имя процедуры, вызываемой при нажатии на кнопку "OK".
//  Отказ                        - Булево - возвращаемый параметр, признак отказа от выполняемого действия.
//  ЗавершениеРаботы             - Булево - признак того, что форма закрывается в процессе завершения работы приложения.
//  ТекстПредупреждения          - Строка - текст предупреждения, выводимый пользователю. По умолчанию, выводится текст
//                                          "Данные были изменены. Сохранить изменения?"
//  ТекстПредупрежденияПриЗавершении - Строка - возвращаемый параметр с текстом предупреждения, выводимым пользователю 
//                                          при завершении приложения. Если параметр указан, то возвращается текст
//                                          "Данные были изменены. Все изменения будут потеряны.".
//
// Пример:
//
//  &НаКлиенте
//  Процедура ПередЗакрытием(Отказ, ЗавершениеРаботы, ТекстПредупреждения, СтандартнаяОбработка)
//    Оповещение = Новый ОписаниеОповещения("ВыбратьИЗакрыть", ЭтотОбъект);
//    ОбщегоНазначенияКлиент.ПоказатьПодтверждениеЗакрытияФормы(Оповещение, Отказ, ЗавершениеРаботы);
//  КонецПроцедуры
//  
//  &НаКлиенте
//  Процедура ВыбратьИЗакрыть(Результат = Неопределено, ДополнительныеПараметры = Неопределено) Экспорт
//     // записываем данные формы.
//     // ...
//     Модифицированность = Ложь; // не выводить подтверждение о закрытии формы еще раз.
//     Закрыть(<РезультатВыбораВФорме>);
//  КонецПроцедуры
//
Процедура ПоказатьПодтверждениеЗакрытияФормы(
		Знач ОповещениеСохранитьИЗакрыть, 
		Отказ, 
		Знач ЗавершениеРаботы, 
		Знач ТекстПредупреждения = "", 
		ТекстПредупрежденияПриЗавершении = Неопределено) Экспорт
	
	Форма = ОповещениеСохранитьИЗакрыть.Модуль;
	Если Не Форма.Модифицированность Тогда
		Возврат;
	КонецЕсли;
	
	Отказ = Истина;
	
	Если ЗавершениеРаботы Тогда
		Если ТекстПредупрежденияПриЗавершении = "" Тогда // передан параметр из ПередЗакрытием
			ТекстПредупрежденияПриЗавершении = НСтр("ru = 'Данные были изменены. Все изменения будут потеряны.'");
		КонецЕсли;
		Возврат;
	КонецЕсли;
	
	Параметры = Новый Структура();
	Параметры.Вставить("ОповещениеСохранитьИЗакрыть", ОповещениеСохранитьИЗакрыть);
	Параметры.Вставить("ТекстПредупреждения", ТекстПредупреждения);
	
	ИмяПараметра = "СтандартныеПодсистемы.ПараметрыПодтвержденияЗакрытияФормы";
	Если ПараметрыПриложения[ИмяПараметра] = Неопределено Тогда
		ПараметрыПриложения.Вставить(ИмяПараметра, Неопределено);
	КонецЕсли;
	
	ТекущиеПараметры = ПараметрыПриложения["СтандартныеПодсистемы.ПараметрыПодтвержденияЗакрытияФормы"];
	Если ТекущиеПараметры <> Неопределено
	   И ТекущиеПараметры.ОповещениеСохранитьИЗакрыть.Модуль = Параметры.ОповещениеСохранитьИЗакрыть.Модуль Тогда
		Возврат;
	КонецЕсли;
	
	ПараметрыПриложения["СтандартныеПодсистемы.ПараметрыПодтвержденияЗакрытияФормы"] = Параметры;
	
	Форма.Активизировать();
	ПодключитьОбработчикОжидания("ПодтвердитьЗакрытиеФормыСейчас", 0.1, Истина);
	
КонецПроцедуры

// Задает вопрос о продолжении действия, которое приведет к закрытию формы.
// Для использования в обработчиках события ПередЗакрытием модулей форм.
// См. также процедуру ОбщегоНазначенияКлиент.ПоказатьПодтверждениеЗакрытияФормы.
//
// Параметры:
//  Форма                        - ФормаКлиентскогоПриложения - форма, которая вызывает диалог предупреждения.
//  Отказ                        - Булево - возвращаемый параметр, признак отказа от выполняемого действия.
//  ЗавершениеРаботы             - Булево - признак завершения работы программы.
//  ТекстПредупреждения          - Строка - текст предупреждения, выводимый пользователю.
//  ИмяРеквизитаЗакрытьФормуБезПодтверждения - Строка - имя реквизита, содержащего в себе признак того, нужно
//                                 выводить предупреждение или нет.
//  ОписаниеОповещенияЗакрыть    - ОписаниеОповещения - содержит имя процедуры, вызываемой при нажатии на кнопку "Да".
//
// Пример: 
//  ТекстПредупреждения = НСтр("ru = 'Закрыть помощник?'");
//  ОбщегоНазначенияКлиент.ПоказатьПодтверждениеЗакрытияПроизвольнойФормы(
//      ЭтотОбъект, Отказ, ЗавершениеРаботы, ТекстПредупреждения, "ЗакрытьФормуБезПодтверждения");
//
Процедура ПоказатьПодтверждениеЗакрытияПроизвольнойФормы(
		Знач Форма, 
		Отказ, 
		Знач ЗавершениеРаботы, 
		Знач ТекстПредупреждения, 
		Знач ИмяРеквизитаЗакрытьФормуБезПодтверждения, 
		Знач ОписаниеОповещенияЗакрыть = Неопределено) Экспорт
		
	Если Форма[ИмяРеквизитаЗакрытьФормуБезПодтверждения] Тогда
		Возврат;
	КонецЕсли;
	
	Отказ = Истина;
	Если ЗавершениеРаботы Тогда
		Возврат;
	КонецЕсли;
	
	Параметры = Новый Структура();
	Параметры.Вставить("Форма", Форма);
	Параметры.Вставить("ТекстПредупреждения", ТекстПредупреждения);
	Параметры.Вставить("ИмяРеквизитаЗакрытьФормуБезПодтверждения", ИмяРеквизитаЗакрытьФормуБезПодтверждения);
	Параметры.Вставить("ОписаниеОповещенияЗакрыть", ОписаниеОповещенияЗакрыть);
	
	ИмяПараметра = "СтандартныеПодсистемы.ПараметрыПодтвержденияЗакрытияФормы";
	Если ПараметрыПриложения[ИмяПараметра] = Неопределено Тогда
		ПараметрыПриложения.Вставить(ИмяПараметра, Неопределено);
	КонецЕсли;
	ПараметрыПриложения["СтандартныеПодсистемы.ПараметрыПодтвержденияЗакрытияФормы"] = Параметры;
	
	ПодключитьОбработчикОжидания("ПодтвердитьЗакрытиеПроизвольнойФормыСейчас", 0.1, Истина);
	
КонецПроцедуры

// Обновляет интерфейс программы сохраняя текущее активное окно.
//
Процедура ОбновитьИнтерфейсПрограммы() Экспорт
	
	ТекущееАктивноеОкно = АктивноеОкно();
	ОбновитьИнтерфейс();
	Если ТекущееАктивноеОкно <> Неопределено Тогда
		ТекущееАктивноеОкно.Активизировать();
	КонецЕсли;
	
КонецПроцедуры

// Оповещает открытые формы и динамические списки об изменении одного объекта.
//
// Параметры:
//  Источник - ЛюбаяСсылка
//           - РегистрСведенийКлючЗаписиИмяРегистраСведений
//           - РегистрНакопленияКлючЗаписиИмяРегистраНакопления
//           - РегистрБухгалтерииКлючЗаписиИмяРегистраБухгалтерии
//           - РегистрРасчетаКлючЗаписиИмяРегистраРасчета - ссылка измененного объекта или ключ измененной записи 
//                 регистра, об изменении которых необходимо уведомить динамические списки и формы.
//  ДополнительныеПараметры - Произвольный - любые параметры, которые необходимо передать в методе Оповестить.
//
Процедура ОповеститьОбИзмененииОбъекта(Источник, Знач ДополнительныеПараметры = Неопределено) Экспорт
	Если ДополнительныеПараметры = Неопределено Тогда
		ДополнительныеПараметры = Новый Структура;
	КонецЕсли;
	Оповестить("Запись_" + ОбщегоНазначенияСлужебныйКлиент.ИмяОбъектаМетаданных(ТипЗнч(Источник)), ДополнительныеПараметры, Источник);
	ОповеститьОбИзменении(Источник);
КонецПроцедуры

// Оповещает открытые формы и динамические списки об изменении сразу нескольких объектов.
//
// Параметры:
//  Источник - Тип
//           - ОписаниеТипов - тип или типы объектов, об изменении которых необходимо уведомить 
//                             динамические списки и формы;
//           - Массив - список измененных ссылок и/или ключей записей регистров, об изменении 
//                      которых необходимо уведомить динамические списки и формы.
//  ДополнительныеПараметры - Произвольный - любые параметры, которые необходимо передать в методе Оповестить.
//
Процедура ОповеститьОбИзмененииОбъектов(Источник, Знач ДополнительныеПараметры = Неопределено) Экспорт
	
	Если ДополнительныеПараметры = Неопределено Тогда
		ДополнительныеПараметры = Новый Структура;
	КонецЕсли;
	
	Если ТипЗнч(Источник) = Тип("Тип") Тогда
		ОповеститьОбИзменении(Источник);
		Оповестить("Запись_" + ОбщегоНазначенияСлужебныйКлиент.ИмяОбъектаМетаданных(Источник), ДополнительныеПараметры);
	ИначеЕсли ТипЗнч(Источник) = Тип("ОписаниеТипов") Тогда
		Для Каждого Тип Из Источник.Типы() Цикл
			ОповеститьОбИзменении(Тип);
			Оповестить("Запись_" + ОбщегоНазначенияСлужебныйКлиент.ИмяОбъектаМетаданных(Тип), ДополнительныеПараметры);
		КонецЦикла;
	ИначеЕсли ТипЗнч(Источник) = Тип("Массив") Тогда
		Если Источник.Количество() = 1 Тогда
			ОповеститьОбИзмененииОбъекта(Источник[0], ДополнительныеПараметры);
		Иначе
			ОповещаемыеТипы = Новый Соответствие;
			Для Каждого Ссылка Из Источник Цикл
				ОповещаемыеТипы.Вставить(ТипЗнч(Ссылка));
			КонецЦикла;
			Для Каждого Тип Из ОповещаемыеТипы Цикл
				ОповеститьОбИзменении(Тип.Ключ);
				Оповестить("Запись_" + ОбщегоНазначенияСлужебныйКлиент.ИмяОбъектаМетаданных(Тип.Ключ), ДополнительныеПараметры);
			КонецЦикла;
		КонецЕсли;
	КонецЕсли;

КонецПроцедуры

// Открывает форму выбора формата вложений.
//
// Параметры:
//  ОписаниеОповещения  - ОписаниеОповещения - обработчик результата выбора.
//  НастройкиФормата - Структура - настройки по умолчанию в форме:
//   * УпаковатьВАрхив   - Булево - признак необходимости упаковки вложений в архив.
//   * ФорматыСохранения - Массив - список выбранных форматов вложений.
//   * ПереводитьИменаФайловВТранслит - Булево - преобразовывать кириллические символы в латиницу.
//  Владелец - ФормаКлиентскогоПриложения - форма, из которой вызывается форма выбора вложений.
//
Процедура ПоказатьВыборФорматаВложений(ОписаниеОповещения, НастройкиФормата, Владелец = Неопределено) Экспорт
	ПараметрыФормы = Новый Структура("НастройкиФормата", НастройкиФормата);
	ОткрытьФорму("ОбщаяФорма.ВыборФорматаВложений", ПараметрыФормы, , , , ,
		ОписаниеОповещения, РежимОткрытияОкнаФормы.БлокироватьОкноВладельца);
КонецПроцедуры

#КонецОбласти

#Область ФормыРедактирования

////////////////////////////////////////////////////////////////////////////////
// Функции для обработки действий пользователя в процессе редактирования
// многострочного текста, например комментария в документах.

// Открывает форму редактирования произвольного многострочного текста.
//
// Параметры:
//  ОповещениеОЗакрытии     - ОписаниеОповещения - содержит описание процедуры, которая будет вызвана 
//                            после закрытия формы ввода текста с теми же параметрами, что и для метода
//                            ПоказатьВводСтроки.
//  МногострочныйТекст      - Строка - произвольный текст, который необходимо отредактировать;
//  Заголовок               - Строка - текст, который необходимо отобразить в заголовке формы.
//
// Пример:
//
//   Оповещение = Новый ОписаниеОповещения("КомментарийЗавершениеВвода", ЭтотОбъект);
//   ОбщегоНазначенияКлиент.ПоказатьФормуРедактированияМногострочногоТекста(Оповещение, Элемент.ТекстРедактирования);
//
//   &НаКлиенте
//   Процедура КомментарийЗавершениеВвода(Знач ВведенныйТекст, Знач ДополнительныеПараметры) Экспорт
//      Если ВведенныйТекст = Неопределено Тогда
//		   Возврат;
//   	КонецЕсли;	
//	
//	   Объект.МногострочныйКомментарий = ВведенныйТекст;
//	   Модифицированность = Истина;
//   КонецПроцедуры
//
Процедура ПоказатьФормуРедактированияМногострочногоТекста(Знач ОповещениеОЗакрытии, 
	Знач МногострочныйТекст, Знач Заголовок = Неопределено) Экспорт
	
	Если Заголовок = Неопределено Тогда
		ПоказатьВводСтроки(ОповещениеОЗакрытии, МногострочныйТекст,,, Истина);
	Иначе
		ПоказатьВводСтроки(ОповещениеОЗакрытии, МногострочныйТекст, Заголовок,, Истина);
	КонецЕсли;
	
КонецПроцедуры

// Открывает форму редактирования многострочного комментария.
//
// Параметры:
//  МногострочныйТекст - Строка - произвольный текст, который необходимо отредактировать.
//  ФормаВладелец      - ФормаКлиентскогоПриложения - форма, в поле которой выполняется ввод комментария.
//  ИмяРеквизита       - Строка - имя реквизита формы, в который будет помещен введенный пользователем комментарий.
//                                По умолчанию - "Объект.Комментарий".
//  Заголовок          - Строка - текст, который необходимо отобразить в заголовке формы.
//                                По умолчанию - "Комментарий".
//
// Пример:
//  ОбщегоНазначенияКлиент.ПоказатьФормуРедактированияКомментария(
//  	Элемент.ТекстРедактирования, ЭтотОбъект, "Объект.Комментарий");
//
Процедура ПоказатьФормуРедактированияКомментария(
	Знач МногострочныйТекст, 
	Знач ФормаВладелец, 
	Знач ИмяРеквизита = "Объект.Комментарий", 
	Знач Заголовок = Неопределено) Экспорт
	
	Контекст = Новый Структура;
	Контекст.Вставить("ФормаВладелец", ФормаВладелец);
	Контекст.Вставить("ИмяРеквизита", ИмяРеквизита);
	
	Оповещение = Новый ОписаниеОповещения(
		"КомментарийЗавершениеВвода", 
		ОбщегоНазначенияСлужебныйКлиент, 
		Контекст);
	
	ЗаголовокФормы = ?(Заголовок <> Неопределено, Заголовок, НСтр("ru = 'Комментарий'"));
	
	ПоказатьФормуРедактированияМногострочногоТекста(Оповещение, МногострочныйТекст, ЗаголовокФормы);
	
КонецПроцедуры

#КонецОбласти

#Область НастройкиПользователя

// Сохраняет персональные настройки пользователя.
//
// Параметры:
//  Настройки - Структура:
//   * НапоминатьОбУстановкеРасширенияРаботыСФайлами  - Булево - признак необходимости
//                                                               напоминания об установке расширения.
//   * ЗапрашиватьПодтверждениеПриЗавершенииПрограммы - Булево - запрашивать подтверждение по завершении работы.
//
Процедура СохранитьПерсональныеНастройки(Настройки) Экспорт
	
	Если Настройки.Свойство("НапоминатьОбУстановкеРасширенияРаботыСФайлами") Тогда
		ПараметрыПриложения["СтандартныеПодсистемы.ПредлагатьУстановкуРасширенияРаботыСФайлами"] = 
			Настройки.НапоминатьОбУстановкеРасширенияРаботыСФайлами;
	КонецЕсли;
	
	Если Настройки.Свойство("ЗапрашиватьПодтверждениеПриЗавершенииПрограммы") Тогда
		СтандартныеПодсистемыКлиент.УстановитьПараметрКлиента("ЗапрашиватьПодтверждениеПриЗавершенииПрограммы",
			Настройки.ЗапрашиватьПодтверждениеПриЗавершенииПрограммы);
	КонецЕсли;
		
	Если Настройки.Свойство("ПерсональныеНастройкиРаботыСФайлами") Тогда
		СтандартныеПодсистемыКлиент.УстановитьПараметрКлиента("ПерсональныеНастройкиРаботыСФайлами",
			Настройки.ПерсональныеНастройкиРаботыСФайлами);
	КонецЕсли;
	
КонецПроцедуры

#КонецОбласти

#Область Стили

////////////////////////////////////////////////////////////////////////////////
// Функции для работы с цветами стиля в клиентском коде.

// Получает цвет стиля по имени элемента стиля.
//
// Параметры:
//  ИмяЦветаСтиля - Строка
//
// Возвращаемое значение:
//  Цвет
//
Функция ЦветСтиля(ИмяЦветаСтиля) Экспорт
	
	Возврат ОбщегоНазначенияКлиентПовтИсп.ЦветСтиля(ИмяЦветаСтиля);
	
КонецФункции

// Получает шрифт стиля по имени элемента стиля.
//
// Параметры:
//  ИмяШрифтаСтиля - Строка
//
// Возвращаемое значение:
//  Шрифт
//
Функция ШрифтСтиля(ИмяШрифтаСтиля) Экспорт
	
	Возврат ОбщегоНазначенияКлиентПовтИсп.ШрифтСтиля(ИмяШрифтаСтиля);
	
КонецФункции

#КонецОбласти

#Область ВнешниеКомпоненты

////////////////////////////////////////////////////////////////////////////////
// Процедуры и функции для подключения и установки внешних компонент из макетов конфигурации.

// Возвращает структуру параметров для процедуры ПодключитьКомпонентуИзМакета.
//
// Возвращаемое значение:
//  Структура:
//      * Кэшировать           - Булево - (по умолчанию Истина) использовать механизм кэширования компонент на клиенте.
//      * ПредложитьУстановить - Булево - (по умолчанию Истина) предлагать устанавливать.
//      * ПредложитьЗагрузить  - Булево - (по умолчанию Ложь) предлагать загрузить компоненту с сайта ИТС.
//      * ТекстПояснения       - Строка - для чего нужна компонента и что не будет работать, если ее не устанавливать.
//      * ИдентификаторыСозданияОбъектов - Массив - идентификатор создания экземпляра модуля объекта,
//                 используется только для компонент, у которых есть несколько идентификаторов создания объектов,
//                 при задании параметр Идентификатор будет игнорироваться.
//      * Изолированно - Булево, Неопределено - (по умолчанию Неопределено) если Истина, компонента будет подключена
//                 изолированно, в этом случае внешняя компонента загружается в отдельный процесс операционной системы;
//                 Ложь - в этом случае внешняя компонента будет выполняться в том же процессе операционной системы,
//                 который выполняет код встроенного языка; Неопределено - поддерживается поведение платформы по умолчанию:
//                 изолированно - если компонентой поддерживается только этот режим, не изолированно - в остальных случаях.
//                 См. https://its.1c.eu/db/v83doc#bookmark:dev:TI000001866
//      * ОбновлятьАвтоматически - Булево - (по умолчанию Истина) если ПредложитьЗагрузить = Истина, при загрузке 
//                 внешней компоненты устанавливать признак ОбновлятьСПортала1СИТС
//
//
// Пример:
//
//  ПараметрыПодключения = ОбщегоНазначенияКлиент.ПараметрыПодключенияКомпоненты();
//  ПараметрыПодключения.ТекстПояснения = НСтр("ru = 'Для использования сканера штрихкодов требуется
//                                             |внешняя компонента ""1С:Сканеры штрихкода (NativeApi)"".'");
//
Функция ПараметрыПодключенияКомпоненты() Экспорт
	
	Параметры = Новый Структура;
	Параметры.Вставить("Кэшировать", Истина);
	Параметры.Вставить("ПредложитьУстановить", Истина);
	Параметры.Вставить("ПредложитьЗагрузить", Ложь);
	Параметры.Вставить("ТекстПояснения", "");
	Параметры.Вставить("ИдентификаторыСозданияОбъектов", Новый Массив);
	Параметры.Вставить("Изолированно", Неопределено);
	Параметры.Вставить("ОбновлятьАвтоматически", Истина);
	
	Возврат Параметры;
	
КонецФункции

// Подключает компоненту, выполненную по технологии Native API и COM, в асинхронном режиме.
// Компонента должна храниться в макете конфигурации в виде ZIP-архива.
// Для веб-клиента предлагается диалог, подсказывающий пользователю действия по установке.
//
// Параметры:
//  Оповещение - ОписаниеОповещения - описание оповещения о подключении со следующими параметрами:
//      * Результат - Структура - результат подключения компоненты:
//          ** Подключено         - Булево - признак подключения.
//          ** ПодключаемыйМодуль - ОбъектВнешнейКомпоненты  - экземпляр объекта внешней компоненты;
//                                - ФиксированноеСоответствие из КлючИЗначение - экземпляры объектов внешней компоненты, 
//                                     указанные в ПараметрыПодключения.ИдентификаторыСозданияОбъектов:
//                                    *** Ключ - Строка - идентификатор внешней компоненты;
//                                    *** Значение - ОбъектВнешнейКомпоненты - экземпляр объекта.
//          ** ОписаниеОшибки     - Строка - краткое описание ошибки. При отмене пользователем пустая строка.
//      * ДополнительныеПараметры - Структура - значение, которое было указано при создании объекта ОписаниеОповещения.
//  Идентификатор        - Строка - идентификатор объекта внешней компоненты.
//  ПолноеИмяМакета      - Строка - полное имя макета, используемое как местоположение компоненты.
//  ПараметрыПодключения - Структура
//                       - Неопределено - см. функцию ПараметрыПодключенияКомпоненты.
//
// Пример:
//
//  Оповещение = Новый ОписаниеОповещения("ПодключитьКомпонентуЗавершение", ЭтотОбъект);
//
//  ПараметрыПодключения = ОбщегоНазначенияКлиент.ПараметрыПодключенияКомпоненты();
//  ПараметрыПодключения.ТекстПояснения = НСтр("ru = 'Для оформления заявления на выпуск сертификата требуется
//                                             |внешняя компонента ""Криптография (CryptS)"".'");
//
//  ОбщегоНазначенияКлиент.ПодключитьКомпонентуИзМакета(Оповещение, 
//      "CryptS",
//      "Обработка.ЗаявлениеНаВыпускНовогоКвалифицированногоСертификата.Макет.КомпонентаОбмена",
//      ПараметрыПодключения);
//
//  &НаКлиенте
//  Процедура ПодключитьКомпонентуЗавершение(Результат, ДополнительныеПараметры) Экспорт
//
//      ПодключаемыйМодуль = Неопределено;
//
//      Если Результат.Подключено Тогда 
//          ПодключаемыйМодуль = Результат.ПодключаемыйМодуль;
//      Иначе
//          Если Не ПустаяСтрока(Результат.ОписаниеОшибки) Тогда
//              ПоказатьПредупреждение(, Результат.ОписаниеОшибки);
//          КонецЕсли;
//      КонецЕсли;
//
//      Если ПодключаемыйМодуль <> Неопределено Тогда 
//          // ПодключаемыйМодуль содержит созданный экземпляр подключенной компоненты.
//      КонецЕсли;
//
//      ПодключаемыйМодуль = Неопределено;
//
//  КонецПроцедуры
//
Процедура ПодключитьКомпонентуИзМакета(Оповещение, Идентификатор, ПолноеИмяМакета,
	ПараметрыПодключения = Неопределено) Экспорт
	
	Параметры = ПараметрыПодключенияКомпоненты();
	Если ПараметрыПодключения <> Неопределено Тогда
		ЗаполнитьЗначенияСвойств(Параметры, ПараметрыПодключения);
	КонецЕсли;
	
	Контекст = ОбщегоНазначенияСлужебныйКлиент.КонтекстПодключенияКомпоненты();
	ЗаполнитьЗначенияСвойств(Контекст, Параметры);
	Контекст.Оповещение = Оповещение;
	Контекст.Идентификатор = Идентификатор;
	Контекст.Местоположение = ПолноеИмяМакета;
	
	ОбщегоНазначенияСлужебныйКлиент.ПодключитьКомпоненту(Контекст);
	
КонецПроцедуры

// Возвращает структуру параметров для процедуры УстановитьКомпонентуИзМакета.
//
// Возвращаемое значение:
//  Структура:
//      * ТекстПояснения - Строка - для чего нужна компонента и что не будет работать, если ее не устанавливать.
//
// Пример:
//
//  ПараметрыУстановки = ОбщегоНазначенияКлиент.ПараметрыУстановкиКомпоненты();
//  ПараметрыУстановки.ТекстПояснения = НСтр("ru = 'Для использования сканера штрихкодов требуется
//                                           |внешняя компонента ""1С:Сканеры штрихкода (NativeApi)"".'");
//
Функция ПараметрыУстановкиКомпоненты() Экспорт
	
	Параметры = Новый Структура;
	Параметры.Вставить("ТекстПояснения", "");
	
	Возврат Параметры;
	
КонецФункции

// Устанавливает компоненту, выполненную по технологии Native API и COM асинхронном режиме.
// Компонента должна храниться в макете конфигурации в виде ZIP-архива.
//
// Параметры:
//  Оповещение - ОписаниеОповещения - описание оповещения об установке внешней компоненты:
//      * Результат - Структура - результат установки компоненты:
//          ** Установлено    - Булево - признак установки.
//          ** ОписаниеОшибки - Строка - краткое описание ошибки. При отмене пользователем пустая строка.
//      * ДополнительныеПараметры - Структура - значение, которое было указано при создании объекта ОписаниеОповещения.
//  ПолноеИмяМакета    - Строка                  - полное имя макета, используемое как местоположение компоненты.
//  ПараметрыУстановки - Структура
//                     - Неопределено - см. функцию ПараметрыУстановкиКомпоненты.
//
// Пример:
//
//  Оповещение = Новый ОписаниеОповещения("УстановитьКомпонентуЗавершение", ЭтотОбъект);
//
//  ПараметрыУстановки = ОбщегоНазначенияКлиент.ПараметрыУстановкиКомпоненты();
//  ПараметрыУстановки.ТекстПояснения = НСтр("ru = 'Для оформления заявления на выпуск сертификата требуется
//                                           |внешняя компонента ""Криптография (CryptS)"".'");
//
//  ОбщегоНазначенияКлиент.УстановитьКомпонентуИзМакета(Оповещение,
//      "Обработка.ЗаявлениеНаВыпускНовогоКвалифицированногоСертификата.Макет.КомпонентаОбмена",
//      ПараметрыУстановки);
//
//  &НаКлиенте
//  Процедура УстановитьКомпонентуЗавершение(Результат, ДополнительныеПараметры) Экспорт
//
//      Если Не Результат.Установлено И Не ПустаяСтрока(Результат.ОписаниеОшибки) Тогда 
//          ПоказатьПредупреждение(, Результат.ОписаниеОшибки);
//      КонецЕсли;
//
//  КонецПроцедуры
//
Процедура УстановитьКомпонентуИзМакета(Оповещение, ПолноеИмяМакета, ПараметрыУстановки = Неопределено) Экспорт
	
	Параметры = ПараметрыУстановкиКомпоненты();
	Если ПараметрыУстановки <> Неопределено Тогда
		ЗаполнитьЗначенияСвойств(Параметры, ПараметрыУстановки);
	КонецЕсли;
	
	Контекст = Новый Структура;
	Контекст.Вставить("Оповещение", Оповещение);
	Контекст.Вставить("Местоположение", ПолноеИмяМакета);
	Контекст.Вставить("ТекстПояснения", Параметры.ТекстПояснения);
	Контекст.Вставить("Идентификатор", ПолноеИмяМакета);
	
	ОбщегоНазначенияСлужебныйКлиент.УстановитьКомпоненту(Контекст);
	
КонецПроцедуры

#Область ДляВызоваИзДругихПодсистем

// БиблиотекаПодключаемогоОборудования
// 
// Устанавливает компоненту, выполненную по технологии Native API и COM асинхронном режиме.
// Компонента должна храниться в макете конфигурации в виде ZIP-архива.
//
// Параметры:
//  ПолноеИмяМакета    - Строка                  - полное имя макета, используемое как местоположение компоненты.
//  ПараметрыУстановки - Структура
//                     - Неопределено - см. функцию ПараметрыУстановкиКомпоненты.
//
// Возвращаемое значение:
//		Структура - результат установки компоненты:
//          * Установлено    - Булево - признак установки.
//          * ОписаниеОшибки - Строка - краткое описание ошибки. При отмене пользователем пустая строка.
//
Асинх Функция УстановитьКомпонентуИзМакетаАсинх(ПолноеИмяМакета, ПараметрыУстановки = Неопределено) Экспорт
	
	Параметры = ПараметрыУстановкиКомпоненты();
	Если ПараметрыУстановки <> Неопределено Тогда
		ЗаполнитьЗначенияСвойств(Параметры, ПараметрыУстановки);
	КонецЕсли;
	
	Контекст = Новый Структура;
	Контекст.Вставить("Местоположение", ПолноеИмяМакета);
	Контекст.Вставить("ТекстПояснения", Параметры.ТекстПояснения);
	Контекст.Вставить("Идентификатор", ПолноеИмяМакета);
	
	Возврат Ждать ОбщегоНазначенияСлужебныйКлиент.УстановитьКомпонентуАсинх(Контекст);
	
КонецФункции

// Подключает компоненту, выполненную по технологии Native API и COM, в асинхронном режиме.
// Компонента должна храниться в макете конфигурации в виде ZIP-архива.
//
// Параметры:
//  Идентификатор        - Строка - идентификатор объекта внешней компоненты.
//  ПолноеИмяМакета      - Строка - полное имя макета, используемое как местоположение компоненты.
//  ПараметрыПодключения - Структура
//                       - Неопределено - см. ПараметрыПодключенияКомпоненты.
//
// Возвращаемое значение:
// 	 Структура - результат подключения компоненты:
//    * Подключено         - Булево - признак подключения.
//    * ПодключаемыйМодуль - ОбъектВнешнейКомпоненты  - экземпляр объекта внешней компоненты;
//                         - ФиксированноеСоответствие из КлючИЗначение - экземпляры объектов внешней компоненты, 
//                           указанные в ПараметрыПодключения.ИдентификаторыСозданияОбъектов:
//                             ** Ключ - Строка - идентификатор внешней компоненты;
//                             ** Значение - ОбъектВнешнейКомпоненты - экземпляр объекта.
//    * ОписаниеОшибки     - Строка - краткое описание ошибки. При отмене пользователем пустая строка.
//
Асинх Функция ПодключитьКомпонентуИзМакетаАсинх(Идентификатор, ПолноеИмяМакета,
	ПараметрыПодключения = Неопределено) Экспорт
	
	Параметры = ПараметрыПодключенияКомпоненты();
	Если ПараметрыПодключения <> Неопределено Тогда
		ЗаполнитьЗначенияСвойств(Параметры, ПараметрыПодключения);
	КонецЕсли;
	
	Контекст = ОбщегоНазначенияСлужебныйКлиент.КонтекстПодключенияКомпоненты();
	ЗаполнитьЗначенияСвойств(Контекст, Параметры);
	Контекст.Идентификатор = Идентификатор;
	Контекст.Местоположение = ПолноеИмяМакета;
	
	Возврат Ждать ОбщегоНазначенияСлужебныйКлиент.ПодключитьКомпонентуАсинх(Контекст);
	
КонецФункции

// Конец БиблиотекаПодключаемогоОборудования

#КонецОбласти

#КонецОбласти

#Область ВнешнееСоединение

////////////////////////////////////////////////////////////////////////////////
// Процедуры и функции для работы с внешним соединением.

// Выполняет регистрацию компоненты "comcntr.dll" для текущей версии платформы.
// В случае успешной регистрации, предлагает пользователю перезапустить клиентский сеанс 
// для того чтобы регистрация вступила в силу.
//
// Вызывается перед клиентским кодом, который использует менеджер COM-соединений (V83.COMConnector)
// и инициируется интерактивными действиями пользователя.
// 
// Параметры:
//  ВыполнитьПерезагрузкуСеанса - Булево - если Истина, то после регистрации COM соединителя
//      будет вызван диалог перезапуска сеанса.
//  Оповещение - ОписаниеОповещения - оповещение о результате регистрации:
//      * Зарегистрировано - Булево - Истина, если COM соединитель зарегистрирован без ошибок.
//      * ДополнительныеПараметры - Произвольный - значение, которое было указано 
//            при создании объекта ОписаниеОповещения.
//
// Пример:
//  ЗарегистрироватьCOMСоединитель();
//
Процедура ЗарегистрироватьCOMСоединитель(Знач ВыполнитьПерезагрузкуСеанса = Истина, 
	Знач Оповещение = Неопределено) Экспорт
	
	Контекст = Новый Структура;
	Контекст.Вставить("ВыполнитьПерезагрузкуСеанса", ВыполнитьПерезагрузкуСеанса);
	Контекст.Вставить("Оповещение", Оповещение);
	
	Если ОбщегоНазначенияСлужебныйКлиент.ЗарегистрироватьCOMСоединительДоступнаРегистрация() Тогда 
	
		ПараметрыЗапускаПрограммы = ФайловаяСистемаКлиент.ПараметрыЗапускаПрограммы();
#Если Не ВебКлиент И Не МобильныйКлиент Тогда
		ПараметрыЗапускаПрограммы.ТекущийКаталог = КаталогПрограммы();
#КонецЕсли
		ПараметрыЗапускаПрограммы.Оповещение = Новый ОписаниеОповещения(
			"ЗарегистрироватьCOMСоединительПриПроверкеРегистрации", ОбщегоНазначенияСлужебныйКлиент, Контекст);
		ПараметрыЗапускаПрограммы.ДождатьсяЗавершения = Истина;
		
		ТекстКоманды = "regsvr32.exe /n /i:user /s comcntr.dll";
		
		ФайловаяСистемаКлиент.ЗапуститьПрограмму(ТекстКоманды, ПараметрыЗапускаПрограммы);
		
	Иначе 
		
		ОбщегоНазначенияСлужебныйКлиент.ЗарегистрироватьCOMСоединительОповеститьОбОшибке(Контекст);
		
	КонецЕсли;
	
КонецПроцедуры

// Устанавливает внешнее соединение с информационной базой по переданным параметрам подключения и возвращает его.
//
// См. ОбщегоНазначения.УстановитьВнешнееСоединениеСБазой.
//
// Параметры:
//  Параметры - см. ОбщегоНазначенияКлиентСервер.СтруктураПараметровДляУстановкиВнешнегоСоединения
// 
// Возвращаемое значение:
//  Структура:
//    * Соединение - COMОбъект
//                 - Неопределено - COM-объект соединения или Неопределено в случае ошибки;
//    * КраткоеОписаниеОшибки - Строка - краткое описание ошибки;
//    * ПодробноеОписаниеОшибки - Строка - подробное описание ошибки;
//    * ОшибкаПодключенияКомпоненты - Булево - флаг ошибки подключения COM.
//
Функция УстановитьВнешнееСоединениеСБазой(Параметры) Экспорт
	
	ПодключениеНедоступно = ЭтоLinuxКлиент() Или ЭтоMacOSКлиент();
	КраткоеОписаниеОшибки = НСтр("ru = 'Прямое подключение к информационной базе доступно только на клиенте под управлением ОС Windows.'");
	
	Возврат ОбщегоНазначенияСлужебныйКлиентСервер.УстановитьВнешнееСоединениеСБазой(Параметры, ПодключениеНедоступно, КраткоеОписаниеОшибки);
	
КонецФункции

#КонецОбласти

#Область РезервноеКопирование

////////////////////////////////////////////////////////////////////////////////
// Процедуры и функции для выполнения резервного копирования в пользовательском режиме.

// Проверяет, возможно ли выполнить резервное копирование в пользовательском режиме.
//
// Возвращаемое значение:
//  Булево - Истина, если предлагать.
//
Функция ПредлагатьСоздаватьРезервныеКопии() Экспорт
	
	Результат = Ложь;
	ИнтеграцияПодсистемБСПКлиент.ПриПроверкеВозможностиРезервногоКопированияВПользовательскомРежиме(Результат);
	Возврат Результат;
	
КонецФункции

// Предлагает пользователю создать резервную копию.
Процедура ПредложитьПользователюСоздатьРезервнуюКопию() Экспорт
	
	ИнтеграцияПодсистемБСПКлиент.ПриПредложенииПользователюСоздатьРезервнуюКопию();
	
КонецПроцедуры

#КонецОбласти
#Область УстаревшиеПроцедурыИФункции

// Устарела. Следует использовать:
//  ФайловаяСистемаКлиент.ОткрытьНавигационнуюСсылку при передачи ссылки на сайт или навигационной ссылки.
//  ФайловаяСистемаКлиент.ОткрытьПроводник для открытия каталога в проводнике.
//  ФайловаяСистемаКлиент.ОткрытьФайл для открытия файла по расширению при передачи пути к файлу.
//
// Выполняет переход по ссылке на объект информационной базы или внешний объект.
// (например, ссылка на сайт или путь каталога на компьютере).
//
// Параметры:
//  Ссылка - Строка - ссылка для перехода.
//
Процедура ПерейтиПоСсылке(Ссылка) Экспорт
	
	#Если ТолстыйКлиентОбычноеПриложение Тогда
		// Особенность платформы: ПерейтиПоНавигационнойСсылке не доступен в толстом клиенте обычного приложения.
		Оповещение = Новый ОписаниеОповещения;
		НачатьЗапускПриложения(Оповещение, Ссылка);
	#Иначе
		ПерейтиПоНавигационнойСсылке(Ссылка);
	#КонецЕсли
	
КонецПроцедуры

// Устарела. Следует использовать ФайловаяСистемаКлиент.ПодключитьРасширениеДляРаботыСФайлами
// Предлагает пользователю установить расширение для работы с 1С:Предприятием в веб-клиенте.
// Предназначена для использования в начале участков кода, в которых ведется работа с файлами.
//
// Параметры:
//   ОписаниеОповещенияОЗакрытии    - ОписаниеОповещения - описание процедуры,
//                                    которая будет вызвана после закрытия формы со следующими параметрами:
//                                      РасширениеПодключено    - Булево - Истина, если расширение было подключено.
//                                      ДополнительныеПараметры - Произвольный - параметры, заданные в
//                                                                               ОписаниеОповещенияОЗакрытии.
//   ТекстПредложения                - Строка - текст сообщения. Если не указан, то выводится текст по умолчанию.
//   ВозможноПродолжениеБезУстановки - Булево - если Истина, будет показана кнопка ПродолжитьБезУстановки,
//                                              если Ложь, будет показана кнопка Отмена.
//
// Пример:
//
//    Оповещение = Новый ОписаниеОповещения("ПечатьДокументаЗавершение", ЭтотОбъект);
//    ТекстСообщения = НСтр("ru = 'Для печати документа необходимо установить расширение для работы с 1С:Предприятием.'");
//    ОбщегоНазначенияКлиент.ПоказатьВопросОбУстановкеРасширенияРаботыСФайлами(Оповещение, ТекстСообщения);
//
//    Процедура ПечатьДокументаЗавершение(РасширениеПодключено, ДополнительныеПараметры) Экспорт
//      Если РасширениеПодключено Тогда
//        // код печати документа, рассчитывающий на то, что расширение подключено.
//        // ...
//      Иначе
//        // код печати документа, который работает без подключенного расширения.
//        // ...
//      КонецЕсли;
//
Процедура ПоказатьВопросОбУстановкеРасширенияРаботыСФайлами(
		ОписаниеОповещенияОЗакрытии, 
		ТекстПредложения = "", 
		ВозможноПродолжениеБезУстановки = Истина) Экспорт
	
	ФайловаяСистемаКлиент.ПодключитьРасширениеДляРаботыСФайлами(
		ОписаниеОповещенияОЗакрытии, 
		ТекстПредложения, 
		ВозможноПродолжениеБезУстановки);
	
КонецПроцедуры

// Устарела. Следует использовать ФайловаяСистемаКлиент.ПодключитьРасширениеДляРаботыСФайлами
// Предлагает пользователю подключить расширение для работы с 1С:Предприятием в веб-клиенте,
// и в случае отказа выдает предупреждение о невозможности продолжения операции.
// Предназначена для использования в начале участков кода, в которых ведется работа с файлами
// только при подключенном расширении.
//
// Параметры:
//  ОписаниеОповещенияОЗакрытии - ОписаниеОповещения - описание процедуры, которая будет вызвана, если расширение
//                                                     подключено со следующими параметрами:
//                                                      Результат               - Булево - всегда Истина.
//                                                      ДополнительныеПараметры - Неопределено
//  ТекстПредложения    - Строка - текст с предложением подключить расширение для работы с 1С:Предприятием. 
//                                 Если не указан, то выводится текст по умолчанию.
//  ТекстПредупреждения - Строка - текст предупреждения о невозможности продолжения операции. 
//                                 Если не указан, то выводится текст по умолчанию.
//
// Пример:
//
//    Оповещение = Новый ОписаниеОповещения("ПечатьДокументаЗавершение", ЭтотОбъект);
//    ТекстСообщения = НСтр("ru = 'Для печати документа необходимо установить расширение для работы с 1С:Предприятием.'");
//    ОбщегоНазначенияКлиент.ПроверитьРасширениеРаботыСФайламиПодключено(Оповещение, ТекстСообщения);
//
//    Процедура ПечатьДокументаЗавершение(Результат, ДополнительныеПараметры) Экспорт
//        // код печати документа, рассчитывающий на то, что расширение подключено.
//        // ...
//
Процедура ПроверитьРасширениеРаботыСФайламиПодключено(ОписаниеОповещенияОЗакрытии, Знач ТекстПредложения = "", 
	Знач ТекстПредупреждения = "") Экспорт
	
	Параметры = Новый Структура("ОписаниеОповещенияОЗакрытии,ТекстПредупреждения", 
		ОписаниеОповещенияОЗакрытии, ТекстПредупреждения, );
	Оповещение = Новый ОписаниеОповещения("ПроверитьРасширениеРаботыСФайламиПодключеноЗавершение",
		ОбщегоНазначенияСлужебныйКлиент, Параметры);
	ФайловаяСистемаКлиент.ПодключитьРасширениеДляРаботыСФайлами(Оповещение, ТекстПредложения);
	
КонецПроцедуры

// Устарела. Следует использовать ФайловаяСистемаКлиент.ПодключитьРасширениеДляРаботыСФайлами
// Возвращает пользовательскую настройку "Предлагать установку расширения для работы с 1С:Предприятием".
//
// Возвращаемое значение:
//  Булево - Истина, если предлагать.
//
Функция ПредлагатьУстановкуРасширенияРаботыСФайлами() Экспорт
	
	СистемнаяИнформация = Новый СистемнаяИнформация();
	ИдентификаторКлиента = СистемнаяИнформация.ИдентификаторКлиента;
	Возврат ОбщегоНазначенияВызовСервера.ХранилищеОбщихНастроекЗагрузить(
		"НастройкиПрограммы/ПредлагатьУстановкуРасширенияРаботыСФайлами", ИдентификаторКлиента, Истина);
	
КонецФункции

// Устарела. Следует использовать ФайловаяСистемаКлиент.ОткрытьФайл
// Открывает файл в программе просмотра, ассоциированной с расширением файла в операционной системе.
// Блокирует возможность открытия файлов, расширение которых относятся к исполняемым файлам.
//
// Параметры:
//  ПутьКФайлу - Строка - полный путь к файлу, который требуется открыть.
//  Оповещение - ОписаниеОповещения - оповещение о результате открытия.
//      если оповещение не задано, в случае ошибки будет показано предупреждение:
//      * ПриложениеЗапущено - Булево - Истина, если внешнее приложение не вызвало ошибок при открытии.
//      * ДополнительныеПараметры - Произвольный - значение, которое было указано при создании объекта ОписаниеОповещения.
//
// Пример:
//  ОбщегоНазначенияКлиент.ОткрытьФайлВПрограммеПросмотра(КаталогДокументов() + "test.pdf");
//  ОбщегоНазначенияКлиент.ОткрытьФайлВПрограммеПросмотра(КаталогДокументов() + "test.xlsx");
//
Процедура ОткрытьФайлВПрограммеПросмотра(ПутьКФайлу, Знач Оповещение = Неопределено) Экспорт
	
	Если Оповещение = Неопределено Тогда 
		ФайловаяСистемаКлиент.ОткрытьФайл(ПутьКФайлу);
	Иначе
		ПараметрыОткрытия = ФайловаяСистемаКлиент.ПараметрыОткрытияФайла();
		ПараметрыОткрытия.ДляРедактирования = Истина;
		ФайловаяСистемаКлиент.ОткрытьФайл(ПутьКФайлу, Оповещение,, ПараметрыОткрытия);
	КонецЕсли;
	
КонецПроцедуры

// Устарела. Следует использовать ФайловаяСистемаКлиент.ОткрытьПроводник
// Открывает проводник с указанным путем.
// Если передан путь к файлу, то выполняет позиционирование курсора в проводнике на этом файле.
//
// Параметры:
//  ПутьККаталогуИлиФайлу - Строка - полный путь к файлу или каталогу.
//
// Пример:
//  // Для Windows
//  ОбщегоНазначенияКлиент.ОткрытьПроводник("C:\Users");
//  ОбщегоНазначенияКлиент.ОткрытьПроводник("C:\Program Files\1cv8\common\1cestart.exe");
//  // Для Linux
//  ОбщегоНазначенияКлиент.ОткрытьПроводник("/home/");
//  ОбщегоНазначенияКлиент.ОткрытьПроводник("/opt/1C/v8.3/x86_64/1cv8c");
//
Процедура ОткрытьПроводник(ПутьККаталогуИлиФайлу) Экспорт
	
	ФайловаяСистемаКлиент.ОткрытьПроводник(ПутьККаталогуИлиФайлу);
	
КонецПроцедуры

// Устарела. Следует использовать ФайловаяСистемаКлиент.ОткрытьНавигационнуюСсылку
// Открывает навигационную ссылку в программе, которая ассоциирована с протоколом навигационной ссылки.
//
// Допустимые протоколы: http, https, e1c, v8help, mailto, tel, skype.
//
// Для открытия проводника или файла в программе просмотра не следует формировать ссылку по протоколу file://
// - для открытия проводника см. ОткрытьПроводник.
// - для открытия файла по расширению см. ОткрытьФайлВПрограммеПросмотра.
//
// Параметры:
//  НавигационнаяСсылка - Строка - ссылка, которую требуется открыть.
//  Оповещение - ОписаниеОповещения - оповещение о результате открытия.
//      если оповещение не задано, в случае ошибки будет показано предупреждение:
//      * ПриложениеЗапущено - Булево - Истина, если внешнее приложение не вызвало ошибок при открытии.
//      * ДополнительныеПараметры - Произвольный - значение, которое было указано при создании объекта ОписаниеОповещения.
//
// Пример:
//  ОбщегоНазначенияКлиент.ОткрытьНавигационнуюСсылку("e1cib/navigationpoint/startpage"); // начальная страница.
//  ОбщегоНазначенияКлиент.ОткрытьНавигационнуюСсылку("v8help://1cv8/QueryLanguageFullTextSearchInData");
//  ОбщегоНазначенияКлиент.ОткрытьНавигационнуюСсылку("https://1c.com");
//  ОбщегоНазначенияКлиент.ОткрытьНавигационнуюСсылку("mailto:help@1c.com");
//  ОбщегоНазначенияКлиент.ОткрытьНавигационнуюСсылку("skype:echo123?call");
//
Процедура ОткрытьНавигационнуюСсылку(НавигационнаяСсылка, Знач Оповещение = Неопределено) Экспорт
	
	ФайловаяСистемаКлиент.ОткрытьНавигационнуюСсылку(НавигационнаяСсылка, Оповещение);
	
КонецПроцедуры

// Устарела. Следует использовать ФайловаяСистемаКлиент.СоздатьВременныйКаталог
// Получение имени временного каталога.
//
// Параметры:
//  Оповещение - ОписаниеОповещения - оповещение о результате получения:
//      * ИмяКаталога             - Строка - путь к созданному каталогу.
//      * ДополнительныеПараметры - Структура - значение, которое было указано при создании объекта ОписаниеОповещения.
//  Расширение - Строка - суффикс в имени каталога, который поможет идентифицировать каталог при анализе.
//
Процедура СоздатьВременныйКаталог(Знач Оповещение, Расширение = "") Экспорт 
	
	ФайловаяСистемаКлиент.СоздатьВременныйКаталог(Оповещение, Расширение);
	
КонецПроцедуры

// Устарела. Следует использовать ОбщегоНазначенияКлиент.ЭтоMacOSКлиент
// Возвращает Истина, если клиентское приложение запущено под управлением ОС X.
//
// Возвращаемое значение:
//  Булево - если нет клиентского приложения, возвращается Ложь.
//
Функция ЭтоOSXКлиент() Экспорт
	
	ТипПлатформыКлиента = ТипПлатформыКлиента();
	Возврат ТипПлатформыКлиента = ТипПлатформы.MacOS_x86
		Или ТипПлатформыКлиента = ТипПлатформы.MacOS_x86_64;
	
КонецФункции

#КонецОбласти

#КонецОбласти
